while (state != -1)
{
- GtkAccessibleValue *value = gtk_accessible_value_collect_for_state (state, &args);
-
- if (value == NULL)
- goto out;
+ GError *error = NULL;
+ GtkAccessibleValue *value =
+ gtk_accessible_value_collect_for_state (state, &error, &args);
+
+ if (error != NULL)
+ {
+ g_critical ("Unable to collect value for state “%s”: %s",
+ gtk_accessible_state_get_attribute_name (state),
+ error->message);
+ g_error_free (error);
+ goto out;
+ }
gtk_at_context_set_accessible_state (context, state, value);
- gtk_accessible_value_unref (value);
+
+ if (value != NULL)
+ gtk_accessible_value_unref (value);
state = va_arg (args, int);
}
if (context == NULL)
return;
+ GError *error = NULL;
GtkAccessibleValue *real_value =
- gtk_accessible_value_collect_for_state_value (state, value);
+ gtk_accessible_value_collect_for_state_value (state, value, &error);
- if (real_value == NULL)
- return;
+ if (error != NULL)
+ {
+ g_critical ("Unable to collect the value for state “%s”: %s",
+ gtk_accessible_state_get_attribute_name (state),
+ error->message);
+ g_error_free (error);
+ return;
+ }
gtk_at_context_set_accessible_state (context, state, real_value);
- gtk_accessible_value_unref (real_value);
+
+ if (real_value != NULL)
+ gtk_accessible_value_unref (real_value);
+
gtk_at_context_update (context);
}
while (property != -1)
{
- GtkAccessibleValue *value = gtk_accessible_value_collect_for_property (property, &args);
-
- /* gtk_accessible_value_collect_for_property() will warn for us */
- if (value == NULL)
- goto out;
+ GError *error = NULL;
+ GtkAccessibleValue *value =
+ gtk_accessible_value_collect_for_property (property, &error, &args);
+
+ if (error != NULL)
+ {
+ g_critical ("Unable to collect the value for property “%s”: %s",
+ gtk_accessible_property_get_attribute_name (property),
+ error->message);
+ g_error_free (error);
+ goto out;
+ }
gtk_at_context_set_accessible_property (context, property, value);
- gtk_accessible_value_unref (value);
+
+ if (value != NULL)
+ gtk_accessible_value_unref (value);
property = va_arg (args, int);
}
if (context == NULL)
return;
+ GError *error = NULL;
GtkAccessibleValue *real_value =
- gtk_accessible_value_collect_for_property_value (property, value);
+ gtk_accessible_value_collect_for_property_value (property, value, &error);
- if (real_value == NULL)
- return;
+ if (error != NULL)
+ {
+ g_critical ("Unable to collect the value for property “%s”: %s",
+ gtk_accessible_property_get_attribute_name (property),
+ error->message);
+ g_error_free (error);
+ return;
+ }
gtk_at_context_set_accessible_property (context, property, real_value);
- gtk_accessible_value_unref (real_value);
+
+ if (real_value != NULL)
+ gtk_accessible_value_unref (real_value);
+
gtk_at_context_update (context);
}
while (relation != -1)
{
- GtkAccessibleValue *value = gtk_accessible_value_collect_for_relation (relation, &args);
-
- /* gtk_accessible_value_collect_for_relation() will warn for us */
- if (value == NULL)
- goto out;
+ GError *error = NULL;
+ GtkAccessibleValue *value =
+ gtk_accessible_value_collect_for_relation (relation, &error, &args);
+
+ if (error != NULL)
+ {
+ g_critical ("Unable to collect the value for relation “%s”: %s",
+ gtk_accessible_relation_get_attribute_name (relation),
+ error->message);
+ g_error_free (error);
+ goto out;
+ }
gtk_at_context_set_accessible_relation (context, relation, value);
- gtk_accessible_value_unref (value);
+
+ if (value != NULL)
+ gtk_accessible_value_unref (value);
relation = va_arg (args, int);
}
if (context == NULL)
return;
+ GError *error = NULL;
GtkAccessibleValue *real_value =
- gtk_accessible_value_collect_for_relation_value (relation, value);
+ gtk_accessible_value_collect_for_relation_value (relation, value, &error);
- if (real_value == NULL)
- return;
+ if (error != NULL)
+ {
+ g_critical ("Unable to collect the value for relation “%s”: %s",
+ gtk_accessible_relation_get_attribute_name (relation),
+ error->message);
+ g_error_free (error);
+ return;
+ }
gtk_at_context_set_accessible_relation (context, relation, real_value);
- gtk_accessible_value_unref (real_value);
+
+ if (real_value != NULL)
+ gtk_accessible_value_unref (real_value);
+
gtk_at_context_update (context);
}
#include "gtkaccessible.h"
#include "gtkenums.h"
+#include <math.h>
+#include <float.h>
+
G_DEFINE_QUARK (gtk-accessible-value-error-quark, gtk_accessible_value_error)
G_DEFINE_BOXED_TYPE (GtkAccessibleValue, gtk_accessible_value,
}
static GtkAccessibleValue *
-gtk_accessible_value_collect_valist (const GtkAccessibleCollect *cstate,
- va_list *args)
+gtk_accessible_value_collect_valist (const GtkAccessibleCollect *cstate,
+ GError **error,
+ va_list *args)
{
GtkAccessibleValue *res = NULL;
GtkAccessibleCollectType ctype = cstate->ctype;
{
int value = va_arg (*args, int);
- if (value == GTK_ACCESSIBLE_VALUE_UNDEFINED)
+ if (collects_undef && value == GTK_ACCESSIBLE_VALUE_UNDEFINED)
res = gtk_undefined_accessible_value_new ();
else
res = gtk_tristate_accessible_value_new (value);
res = (* ctor) (value);
}
+
+ if (res == NULL)
+ {
+ g_set_error (error, GTK_ACCESSIBLE_VALUE_ERROR,
+ GTK_ACCESSIBLE_VALUE_ERROR_INVALID_TOKEN,
+ "Invalid value for token attribute: %d",
+ value);
+ }
}
break;
double value = va_arg (*args, double);
+ if (isnan (value) || isinf (value))
+ {
+ g_set_error_literal (error, GTK_ACCESSIBLE_VALUE_ERROR,
+ GTK_ACCESSIBLE_VALUE_ERROR_INVALID_VALUE,
+ "Invalid numeric value");
+ return NULL;
+ }
+
if (ctor == NULL)
res = gtk_number_accessible_value_new (value);
else
const char *value = va_arg (*args, char*);
if (ctor == NULL)
- res = gtk_string_accessible_value_new (value);
+ {
+ if (value != NULL)
+ res = gtk_string_accessible_value_new (value);
+ }
else
- res = (* ctor) (value);
+ {
+ res = (* ctor) (value);
+ }
}
break;
gpointer value = va_arg (*args, gpointer);
- if (value == NULL)
+ if (value != NULL && !GTK_IS_ACCESSIBLE (value))
{
- if (ctor == NULL)
- res = gtk_undefined_accessible_value_new ();
- else
- res = (* ctor) (value);
+ g_set_error_literal (error, GTK_ACCESSIBLE_VALUE_ERROR,
+ GTK_ACCESSIBLE_VALUE_ERROR_INVALID_VALUE,
+ "Reference does not implement GtkAccessible");
+ return NULL;
}
- else
+
+ if (ctor == NULL)
{
- if (ctor == NULL)
+ if (value != NULL)
res = gtk_reference_accessible_value_new (value);
- else
- res = (* ctor) (value);
+ }
+ else
+ {
+ res = (* ctor) (value);
}
}
break;
GList *value = va_arg (*args, gpointer);
- if (value == NULL)
+ if (ctor == NULL)
{
- if (ctor == NULL)
- res = gtk_undefined_accessible_value_new ();
+ if (value == NULL)
+ res = NULL;
else
- res = (* ctor) (value);
+ res = gtk_reference_list_accessible_value_new (value);
}
else
{
- if (ctor == NULL)
- res = gtk_reference_list_accessible_value_new (value);
- else
- res = (* ctor) (value);
+ res = (* ctor) (value);
}
}
break;
case GTK_ACCESSIBLE_COLLECT_UNDEFINED:
case GTK_ACCESSIBLE_COLLECT_INVALID:
default:
- g_critical ("Unknown type for accessible state “%s”", cstate->name);
+ g_assert_not_reached ();
break;
}
}
static GtkAccessibleValue *
-gtk_accessible_value_collect_value (const GtkAccessibleCollect *cstate,
- const GValue *value_)
+gtk_accessible_value_collect_value (const GtkAccessibleCollect *cstate,
+ const GValue *value_,
+ GError **error)
{
GtkAccessibleValue *res = NULL;
GtkAccessibleCollectType ctype = cstate->ctype;
{
int value = g_value_get_int (value_);
- if (value == GTK_ACCESSIBLE_VALUE_UNDEFINED)
+ if (collects_undef && value == GTK_ACCESSIBLE_VALUE_UNDEFINED)
res = gtk_undefined_accessible_value_new ();
else
res = gtk_tristate_accessible_value_new (value);
res = (* ctor) (value);
}
+
+ if (res == NULL)
+ {
+ g_set_error (error, GTK_ACCESSIBLE_VALUE_ERROR,
+ GTK_ACCESSIBLE_VALUE_ERROR_INVALID_TOKEN,
+ "Invalid value for token attribute: %d",
+ value);
+ }
}
break;
double value = g_value_get_double (value_);
+ if (isnan (value) || isinf (value))
+ {
+ g_set_error_literal (error, GTK_ACCESSIBLE_VALUE_ERROR,
+ GTK_ACCESSIBLE_VALUE_ERROR_INVALID_VALUE,
+ "Invalid numeric value");
+ return NULL;
+ }
+
if (ctor == NULL)
res = gtk_number_accessible_value_new (value);
else
const char *value = g_value_get_string (value_);
if (ctor == NULL)
- res = gtk_string_accessible_value_new (value);
+ {
+ if (value != NULL)
+ res = gtk_string_accessible_value_new (value);
+ }
else
- res = (* ctor) (value);
+ {
+ res = (* ctor) (value);
+ }
}
break;
gpointer value = g_value_get_object (value_);
+ if (value != NULL && !GTK_IS_ACCESSIBLE (value))
+ {
+ g_set_error_literal (error, GTK_ACCESSIBLE_VALUE_ERROR,
+ GTK_ACCESSIBLE_VALUE_ERROR_INVALID_VALUE,
+ "Reference does not implement GtkAccessible");
+ return NULL;
+ }
+
if (ctor == NULL)
- res = gtk_reference_accessible_value_new (value);
+ {
+ if (value != NULL)
+ res = gtk_reference_accessible_value_new (value);
+ }
else
- res = (* ctor) (value);
+ {
+ res = (* ctor) (value);
+ }
}
break;
GList *value = g_value_get_pointer (value_);
if (ctor == NULL)
- res = gtk_reference_list_accessible_value_new (value);
+ {
+ if (value != NULL)
+ res = gtk_reference_list_accessible_value_new (value);
+ }
else
- res = (* ctor) (value);
+ {
+ res = (* ctor) (value);
+ }
}
break;
case GTK_ACCESSIBLE_COLLECT_UNDEFINED:
case GTK_ACCESSIBLE_COLLECT_INVALID:
default:
- g_critical ("Unknown type for accessible state “%s”", cstate->name);
+ g_assert_not_reached ();
break;
}
/*< private >
* gtk_accessible_value_collect_for_state:
* @state: a #GtkAccessibleState
+ * @error: return location for a #GError
* @args: a `va_list` reference
*
* Collects and consumes the next item in the @args variadic arguments list,
* and returns a #GtkAccessibleValue for it.
*
- * Returns: (transfer full): a #GtkAccessibleValue
+ * If the collection fails, @error is set and %NULL is returned.
+ *
+ * The returned value could be %NULL even on success, in which case the state
+ * should be reset to its default value by the caller.
+ *
+ * Returns: (transfer full) (nullable): a #GtkAccessibleValue
*/
GtkAccessibleValue *
-gtk_accessible_value_collect_for_state (GtkAccessibleState state,
- va_list *args)
+gtk_accessible_value_collect_for_state (GtkAccessibleState state,
+ GError **error,
+ va_list *args)
{
const GtkAccessibleCollect *cstate = &collect_states[state];
g_return_val_if_fail (state <= GTK_ACCESSIBLE_STATE_SELECTED, NULL);
- return gtk_accessible_value_collect_valist (cstate, args);
+ return gtk_accessible_value_collect_valist (cstate, error, args);
}
/*< private >
* gtk_accessible_value_collect_for_state_value:
* @state: a #GtkAccessibleState
* @value: a #GValue
+ * @error: return location for a #GError
*
* Retrieves the value stored inside @value and returns a #GtkAccessibleValue
* for the given @state.
*
- * Returns: (transfer full): a #GtkAccessibleValue
+ * If the collection fails, @error is set and %NULL is returned.
+ *
+ * The returned value could be %NULL even on success, in which case the state
+ * should be reset to its default value by the caller.
+ *
+ * Returns: (transfer full) (nullable): a #GtkAccessibleValue
*/
GtkAccessibleValue *
-gtk_accessible_value_collect_for_state_value (GtkAccessibleState state,
- const GValue *value)
+gtk_accessible_value_collect_for_state_value (GtkAccessibleState state,
+ const GValue *value,
+ GError **error)
{
const GtkAccessibleCollect *cstate = &collect_states[state];
g_return_val_if_fail (state <= GTK_ACCESSIBLE_STATE_SELECTED, NULL);
- return gtk_accessible_value_collect_value (cstate, value);
+ return gtk_accessible_value_collect_value (cstate, value, error);
}
/*< private >
/*< private >
* gtk_accessible_value_collect_for_property:
* @property: a #GtkAccessibleProperty
+ * @error: return location for a #GError
* @args: a `va_list` reference
*
* Collects and consumes the next item in the @args variadic arguments list,
* and returns a #GtkAccessibleValue for it.
*
- * Returns: (transfer full): a #GtkAccessibleValue
+ * If the collection fails, @error is set.
+ *
+ * Returns: (transfer full) (nullable): a #GtkAccessibleValue
*/
GtkAccessibleValue *
-gtk_accessible_value_collect_for_property (GtkAccessibleProperty property,
- va_list *args)
+gtk_accessible_value_collect_for_property (GtkAccessibleProperty property,
+ GError **error,
+ va_list *args)
{
const GtkAccessibleCollect *cstate = &collect_props[property];
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT, NULL);
- return gtk_accessible_value_collect_valist (cstate, args);
+ return gtk_accessible_value_collect_valist (cstate, error, args);
}
/*< private >
* gtk_accessible_value_collect_for_property_value:
* @property: a #GtkAccessibleProperty
* @value: a #GValue
+ * @error: return location for a #GError
*
* Retrieves the value stored inside @value and returns a #GtkAccessibleValue
* for the given @property.
*
- * Returns: (transfer full): a #GtkAccessibleValue
+ * If the collection fails, @error is set.
+ *
+ * The returned value could be %NULL even on success, in which case the property
+ * should be reset to its default value by the caller.
+ *
+ * Returns: (transfer full) (nullable): a #GtkAccessibleValue
*/
GtkAccessibleValue *
-gtk_accessible_value_collect_for_property_value (GtkAccessibleProperty property,
- const GValue *value)
+gtk_accessible_value_collect_for_property_value (GtkAccessibleProperty property,
+ const GValue *value,
+ GError **error)
{
const GtkAccessibleCollect *cstate = &collect_props[property];
g_return_val_if_fail (property <= GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT, NULL);
- return gtk_accessible_value_collect_value (cstate, value);
+ return gtk_accessible_value_collect_value (cstate, value, error);
}
/*< private >
/*< private >
* gtk_accessible_value_collect_for_relation:
* @relation: a #GtkAccessibleRelation
+ * @error: return location for a #GError
* @args: a `va_list` reference
*
* Collects and consumes the next item in the @args variadic arguments list,
* and returns a #GtkAccessibleValue for it.
*
- * Returns: (transfer full): a #GtkAccessibleValue
+ * If the collection fails, @error is set and %NULL is returned.
+ *
+ * The returned value could be %NULL even on success, in which case the relation
+ * should be reset to its default value by the caller.
+ *
+ * Returns: (transfer full) (nullable): a #GtkAccessibleValue
*/
GtkAccessibleValue *
-gtk_accessible_value_collect_for_relation (GtkAccessibleRelation relation,
- va_list *args)
+gtk_accessible_value_collect_for_relation (GtkAccessibleRelation relation,
+ GError **error,
+ va_list *args)
{
const GtkAccessibleCollect *cstate = &collect_rels[relation];
g_return_val_if_fail (relation <= GTK_ACCESSIBLE_RELATION_SET_SIZE, NULL);
- return gtk_accessible_value_collect_valist (cstate, args);
+ return gtk_accessible_value_collect_valist (cstate, error, args);
}
/*< private >
* gtk_accessible_value_collect_for_relation_value:
* @relation: a #GtkAccessibleRelation
* @value: a #GValue
+ * @error: return location for a #GError
*
* Retrieves the value stored inside @value and returns a #GtkAccessibleValue
* for the given @relation.
*
- * Returns: (transfer full): a #GtkAccessibleValue
+ * If the collection fails, @error is set and %NULL is returned.
+ *
+ * The returned value could be %NULL even on success, in which case the relation
+ * should be reset to its default value by the caller.
+ *
+ * Returns: (transfer full) (nullable): a #GtkAccessibleValue
*/
GtkAccessibleValue *
-gtk_accessible_value_collect_for_relation_value (GtkAccessibleRelation relation,
- const GValue *value)
+gtk_accessible_value_collect_for_relation_value (GtkAccessibleRelation relation,
+ const GValue *value,
+ GError **error)
{
const GtkAccessibleCollect *cstate = &collect_rels[relation];
g_return_val_if_fail (relation <= GTK_ACCESSIBLE_RELATION_SET_SIZE, NULL);
- return gtk_accessible_value_collect_value (cstate, value);
+ return gtk_accessible_value_collect_value (cstate, value, error);
}
/* }}} */